C.MapObjects = { };

C.MapObjects.Planets = { };
C.MapObjects.Colors = { };
C.MapObjects.Blooms = { };

function C.ParseMap()
	
	for _, v in pairs( ents.FindByClass( "logic_case" ) ) do
		
		local tab = v:GetKeyValues();
		
		if( tab.Case01 == "planet" ) then
			
			table.insert( C.MapObjects.Planets, {
				pos = v:GetPos(),
				radius = tonumber( tab.Case02 ),
				gravity = tonumber( tab.Case03 ),
				pressure = tonumber( tab.Case04 ),
				shadetemp = tonumber( tab.Case05 ),
				suntemp = tonumber( tab.Case06 ),
				colorid = tab.Case07;
				bloomid = tab.Case08;
				flag = tonumber( tab.Case16 ),
				spawn = false
			} );
			
		elseif( tab.Case01 == "planet_color" ) then
			
			table.insert( C.MapObjects.Colors, {
				addcol = Vector( tab.Case02 ),
				mulcol = Vector( tab.Case03 ),
				brightness = tonumber( tab.Case04 ),
				contrast = tonumber( tab.Case05 ),
				color = tonumber( tab.Case06 ),
				id = tab.Case16
			} );
			
		elseif( tab.Case01 == "planet_bloom" ) then
			
			table.insert( C.MapObjects.Blooms, {
				color = Vector( tab.Case02 ),
				x = tonumber( string.Explode( " ", tab.Case03 )[1] ),
				y = tonumber( string.Explode( " ", tab.Case03 )[2] ),
				passes = tonumber( tab.Case04 ),
				darken = tonumber( tab.Case05 ),
				multiply = tonumber( tab.Case06 ),
				colormul = tonumber( tab.Case07 ),
				id = tab.Case16
			} );
			
		elseif( tab.Case01 == "planet2" ) then
			
			local oxy = false;
			
			if( tonumber( tab.Case09 ) > 0 ) then
				
				oxy = true;
				
			end
			
			table.insert( C.MapObjects.Planets, {
				pos = v:GetPos(),
				radius = tonumber( tab.Case02 ),
				gravity = tonumber( tab.Case03 ),
				pressure = tonumber( tab.Case05 ),
				shadetemp = tonumber( tab.Case06 ),
				suntemp = tonumber( tab.Case07 ),
				colorid = tab.Case15,
				bloomid = tab.Case16,
				flag = ( oxy and 1 or tonumber( tab.Case08 ) ),
				spawn = false
			} );
			
		end
		
	end
	
end
hook.Add( "InitPostEntity", "C.ParseMap", C.ParseMap );

function C.SyncMap( ply )
	
	umsg.Start( "SM_S", ply );
	umsg.End();
	
	local del = 0;
	
	for _, v in pairs( C.MapObjects.Planets ) do
		
		timer.Simple( del, function()
			
			umsg.Start( "SM_1", ply );
				umsg.Vector( v.pos );
				umsg.Short( v.radius );
				umsg.Float( v.gravity );
				umsg.Float( v.pressure );
				umsg.Short( v.suntemp );
				umsg.Short( v.shadetemp );
				umsg.String( v.colorid );
				umsg.String( v.bloomid );
				umsg.Short( v.flag );
			umsg.End();
			
		end );
		del = del + 0.05;
		
	end
	
	for _, v in pairs( C.MapObjects.Colors ) do
		
		timer.Simple( del, function()
			
			umsg.Start( "SM_2", ply );
				umsg.Vector( v.addcol );
				umsg.Vector( v.mulcol );
				umsg.Float( v.brightness );
				umsg.Float( v.contrast );
				umsg.Float( v.color );
				umsg.String( v.id );
			umsg.End();
			
		end );
		del = del + 0.05;
		
	end
	
	for _, v in pairs( C.MapObjects.Blooms ) do
		
		timer.Simple( del, function()
			
			umsg.Start( "SM_3", ply );
				umsg.Vector( v.color );
				umsg.Float( v.x );
				umsg.Float( v.y );
				umsg.Float( v.passes );
				umsg.Float( v.darken );
				umsg.Float( v.multiply );
				umsg.Float( v.colormul );
				umsg.String( v.id );
			umsg.End();
			
		end );
		del = del + 0.05;
		
	end
	
end

function ccResetMap( ply, cmd, args )
	
	C.SyncMap( ply );
	C.PCM( ply, Vector( 255, 255, 255 ), "Map synced" );
	
end
concommand.Add( "c_resyncmap", ccResetMap );

C.NextEarthquake = 0;

function C.RunEarthquakes()
	
	for _, v in pairs( C.MapObjects.Planets ) do
		
		if( v.flag == 2 or v.flag == 3 or v.flag == 6 or v.flag == 7 ) then
			
			if( CurTime() >= C.NextEarthquake ) then
				
				util.ScreenShake( v.pos, 1000, 1000, 10, v.radius );
				C.NextEarthquake = CurTime() + math.random( 30, 90 );
				
			end
			
		end
		
	end
	
end